import store from '@/store'
import axios from 'axios'
import { Message } from 'element-ui'
import util from '@/libs/util'

// 创建一个错误
function errorCreate (msg) {
  const error = new Error(msg)
  errorLog(error)
  throw error
}

// 记录和显示错误
function errorLog (error) {
  // 添加到日志
  store.dispatch('d2admin/log/push', {
    message: '数据请求异常',
    type: 'danger',
    meta: {
      error
    }
  })
  // 打印到控制台
  if (process.env.NODE_ENV === 'development') {
    util.log.danger('>>>>>> Error >>>>>>')
    console.log(error)
  }
  // 显示提示
  Message({
    message: error.message,
    type: 'error',
    duration: 5 * 1000
  })
}

// 创建一个 axios 实例
const service = axios.create({
  baseURL: process.env.VUE_APP_API,
  timeout: 5000 // 请求超时时间
})

// 2. 配置 axios 请求拦截器
service.interceptors.request.use((config) => {
  // 拦截成功
  // 2.1 获取 token
  // const token = util.cookies.get('token');
  const token =sessionStorage.token 
  // 2.2 将 token 添加到请求头的 Authorization 属性中
  config.headers['token'] = token;
  // config.headers["Accept"]='application/json';
  // config.headers["Access-Control-Allow-Origin"]='*';
  // config.headers = {
  //   'Access-Control-Allow-Origin':'*'
  // }
  return config;
}, (err) => {
  // 拦截失败
  return err;
});

// 响应拦截器
service.interceptors.response.use((res) => {
  // 响应成功
  return res; // { data: {} }
}, (err) => {
  // return err
  // 响应失败
  // 判断错误类型，并将错误的描述添加到 err.message 属性上
  if (err && err.response) {
      switch (err.response.status) {
          case 400:
              err.message = '请求错误(400)';
              break;
          case 401:
              err.message = '身份认证失败(401)';
              alert('你还未登录，请登录');
              break;
          case 403:
              err.message = '拒绝访问(403)';
              break;
          case 404:
              err.message = '请求出错(404)';
              break;
          case 408:
              err.message = '请求超时(408)';
              break;
          case 500:
              err.message = '服务器错误(500)';
              break;
          case 501:
              err.message = '服务未实现(501)';
              break;
          case 502: 
              err.message = '网络错误(502)';
              break;
          case 503:
              err.message = '服务不可用(503)';
              break;
          case 504:
              err.message = '网络超时(504)';
              break;
          case 505:
              err.message = 'HTTP版本不受支持(505)';
              break;
          default:
              err.message = `连接出错(${err.response.status})!`;
      }
      return {
          data: {
              status: 0,
              type: err.response.status,
              message: err.message
          }
      }
  } else {
      err.message = '服务器连接失败！';
      return {
          data: {
              status: 0,
              message: err.message
          }
      }
  }
});







// 请求拦截器
// service.interceptors.request.use(
//   config => {
//     // 在请求发送之前做一些处理
//     const token = util.cookies.get('token')
//     // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
//     config.headers['token'] = token
//     return config
//   },
//   error => {
//     // 发送失败
//     console.log(error)
//     return Promise.reject(error)
//   }
// )

// // 响应拦截器
// service.interceptors.response.use(
//   response => {
//     // dataAxios 是 axios 返回数据中的 data
//     const dataAxios = response.data
//     // 这个状态码是和后端约定的
//     const { code } = dataAxios
//     // 根据 code 进行判断
//     if (code === undefined) {
//       // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 D2Admin 请求最新版本
//       return dataAxios
//     } else {
//       // 有 code 代表这是一个后端接口 可以进行进一步的判断
//       switch (code) {
//         case 200:
//           // [ 示例 ] code === 200 代表没有错误
//           return dataAxios.data
//         case 401:
//           // [ 示例 ] 其它和后台约定的 code
//           // errorCreate(`[ code: xxx ] ${dataAxios.msg}: ${response.config.url}`)
//           store.dispatch('d2admin/account/logout')
//           break
//         default:
//           // 不是正确的 code
//           errorCreate(`${dataAxios.msg}: ${response.config.url}`)
//           break
//       }
//     }
//   },
//   error => {
//     if (error && error.response) {
//       switch (error.response.status) {
//         case 400: error.message = '请求错误'; break
//         case 401: error.message = '未授权，请登录'; break
//         case 403: error.message = '拒绝访问'; break
//         case 404: error.message = `请求地址出错: ${error.response.config.url}`; break
//         case 408: error.message = '请求超时'; break
//         case 500: error.message = '服务器内部错误'; break
//         case 501: error.message = '服务未实现'; break
//         case 502: error.message = '网关错误'; break
//         case 503: error.message = '服务不可用'; break
//         case 504: error.message = '网关超时'; break
//         case 505: error.message = 'HTTP版本不受支持'; break
//         default: break
//       }
//     }
//     errorLog(error)
//     return Promise.reject(error)
//   }
// )

export default service
